package net.lzzy.practices.services;

import net.lzzy.practices.entities.User;
import net.lzzy.practices.repositonies.UserProjection;
import net.lzzy.practices.repositonies.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.Transient;
import java.util.List;
import java.util.UUID;

/**
 * @author m
 */
@Service
//标记这个类是业务层 ， 实现业务层
public class UserServiceImpl implements UserService{
    //对象引用
    private final UserRepository repository;
    @Autowired
    public UserServiceImpl(UserRepository repository) {
        this.repository = repository;
    }

    /**
     * 登入是检查用户密码是否正确
     *
     * @param userName 要检查的用户
     * @param password 对应的密码
     * @return 检查正确返回User 对象 否则返回null
     */
    @Override
    public User check(String userName, String password) {
//        if(repository.countByUserName(userName)>0)
//        return repository.findUserByPasswordAndUserName(password,userName);
        return  repository.findUserByUserNameAndPassword(userName,password);
    }

    /**
     * 获取用户sale
     *
     * @param userName 该用户用户名
     * @return salt
     */
    @Override
    public String getSalt(String userName) {
        List<UserProjection> users= repository.getUsersByUserName(userName);
        if(users==null || users.size()==0)
        return null;

        UserProjection user = users.get(0);
        String salt = user.getSalt();
        return  salt == null ? "" : salt;
    }

    /**
     * 注册新用户
     *
     * @param user 前端传递的User对象
     * @return 注册成功返回的已注册的User对象
     */
    @Override
    public User register(User user) {
        //添加数据
        return repository.save(user);
    }

    /**
     * 检查用户名是否被占用
     *
     * @param userName 要检查的用户名
     * @return 布尔值，是否被占用
     */
    @Override
    public Boolean isUserNameOccupied(String userName) {
        return repository.countByUserName(userName)>0;
    }

    /**
     * @return 用户合集
     */
    @Override
    public List<User> get() {
        return repository.findAllByOrderByUpdateTimeDesc();
    }

    /**
     * @param page 当前页码
     * @param size 每一页数据大小
     * @return 用户合集
     */
    @Override
    public List<User> get(int page, int size) {
        return repository.findAllByOrderByUpdateTimeDesc(PageRequest.of(page,size));
//        return  null;
    }

    /**
     * 统计用户数量
     *
     * @return 用户数量
     */
    @Override
    public Integer count() {
        return repository.countAllBy();
    }

    /**
     * 根据关键词搜索用户
     *
     * @param kw
     * @return 返回符合条件的用户集合
     */
    @Override
    public List<User> search(String kw) {
        return repository.findByQuery(kw);
    }

    /**
     * 获取申请教师资格的用户
     *
     * @param applying true 表示申请教师的用户
     * @return 符合条件的用户集合
     */
    @Override
    public List<User> getByApplyTeacjer(boolean applying) {
        return repository.findUsersByApplyTeacherOrderByUpdateTimeDesc(applying);
    }

    /**
     * 审批通过教师资格
     *
     * @param id 用户id
     * @return 审批后的该用户对象
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public User approveTeacjer(UUID id) {
        User user = repository.findById(id).orElse(null);
        if(user != null){
            user.setType(User.TYPE_TEACHER);
            user.setApplyTeacher(false);
        }
        return null;
    }

    /**
     * 审批不通过
     *
     * @param id 用户id
     * @return 审批后的该用户对象
     */
    @Override
    public User declineTeacher(UUID id) {
        User user = repository.findById(id).orElse(null);
        if (user != null){
//            user.setType(User.TYPE_BANNED);
            user.setApplyTeacher(false);
            return  repository.save(user);
    }
        return null;
    }

    /**
     * 禁止该户登入
     *
     * @param id 用户id
     * @return 审批后的该用户对象
     */
    @Override
    public User banUser(UUID id) {
        User user= repository.findById(id).orElse(null);
        if(user!=null && user.getType()!=User.TYPE_ADMIN){
            user.setType(User.TYPE_BANNED);
            return  repository.save(user);

        }

        return null;
    }

    /**
     * 根据id获取用户
     *
     * @param id 用户id
     * @return 用户对象
     */
    @Override
    public User getById(UUID id) {
        return  repository.findById(id).orElse(null);
    }

//    List<User>
}
